/*****************************************************************************
 * file  : systask.c
 * creat : apleilx
 * data  : 2017/11/05
 *******************************************************************************/
#define _SYSTASK_MODULE_
#include "os_obj.h"
#include "sys_task.h"
#include "pincfg.h"
#include "framework.h"
#include "swap.h"
#include "bsp_api.h"
#include "fun_list.h"
#include "mbedtls\aes.h"
#include "symbol_def.h"
#include "lib_surport.h"

/*****************************************************************************
 * @brief   fun.
 *****************************************************************************/
void sys_led_ctr(void);
void sys_tick_exe(void);
void system_info(void);
int lib_chk(int argc, char *argv[]);

FUN_LIST_REF(nsys);
FUN_LIST_REF(napp);

/*****************************************************************************
 * @brief   var.
 *****************************************************************************/

/*****************************************************************************
 * @brief   system task.
 *
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
void task_system(const void *argument)
{
	uint32_t tick;

	sys_app_init();

	app_timer_task_add(sys_tick_exe);

	thread_create();

	while (1)
	{

		fun_list_run_once(nsys);
		fun_list_run_once(napp);

		Gst.info.stack_used = stack_used();

		Gst.u_tick = app_tick_get();

		// 虚拟RTC
		pulse_creat(&Gst.pulse, Gst.u_tick);
		if (Gst.pulse.pulse_1s)
		{
			TimeRun(&Gst.rtc_time);
		}

		sys_app_run_once();

		tick = app_tick_get();
		// bsp_dly_ms(200);
		Gst.bsp_dly_verify = app_tick_get() - tick;

		NOP1();
		osDelay(ms_ticks(10));
		NOP1();
	}
}

/*****************************************************************************
 * @brief   led control.
 *****************************************************************************/
void mem_check_mark(void)
{
	uint32_t lrc;

#define mem_chk_base 0x20000000UL
#define LRC_ADDR01 (mem_chk_base + 0x00)
#define LRC_ADDR02 (mem_chk_base + 0x04)
#define LRC_ADDR0_RES (mem_chk_base + 0x08)
#define LRC_ADDR0_NRES (mem_chk_base + 0x0C)

	lrc = 0;
	lrc += inpw(LRC_ADDR01);
	lrc += inpw(LRC_ADDR02);

	outpw(LRC_ADDR0_RES, lrc);
	outpw(LRC_ADDR0_NRES, ~lrc);
}
obj_app_order(mem_check_mark);

/*******************************************************************************
 * @brief: lib check
 * @param argc 参数数量
 * @param argv 参数指针
 * @return 错误代码
 ******************************************************************************/
int lib_chk(int argc, char *argv[])
{
	loop(10)
	{
		lib_chk_test();
		mem_check_mark();
	}
	
	return 0;
}
DBG_FUN_EXPORT(lib_chk);


/*****************************************************************************
 * @brief   led control.
 *****************************************************************************/
void sys_led_ctr(void)
{
	static word_tt st = {1};

	if (!Gst.pulse.pulse_10ms)
		return;

	// 位移
	if (Gst.pulse.pulse_100ms)
	{
		st.uval = bit16_roll_shift_left(st.uval, 4, 1);
	}

	// 输出
	o_led1.out(st.bits.b0);
	o_led2.out(st.bits.b1);
}
obj_app_order(sys_led_ctr);

/*****************************************************************************
 *
 * @brief   task switch hook.
 *
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
void task_sw_hook(char pos)
{
}

/*****************************************************************************
 *
 * @brief   sys_tick_exe
 *
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
void sys_tick_exe(void)
{
}

/*****************************************************************************
 * @brief   system info.
 *
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
void system_info(void)
{
	dbg_puts(PTCR);

	dbg_puts(asc_pic_light);

	dbg_puts(PTCR);
}

/*****************************************************************************
 * @brief   tick get.
 *
 * @ Pass/ Fail criteria: tick
 *****************************************************************************/
unsigned long rt_tick_get(void)
{
	return app_tick_get();
}

fun_list_hook(nsys)
{
}
